package com.tte.common.mapstruct;

import com.tte.common.model.vo.RequestModel;
import com.tte.common.model.vo.ResponseModel;
import com.tte.common.model.vo.ResultBean;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

/**
 * 创建一个 Mapper 接口，并定义映射方法。MapStruct 将为我们自动生成这个接口的实现类。
 * 此实现使用简单的Java方法调用在源对象和目标对象之间进行映射，没有反射或类似内容。
 *
 * MapStruct 将在编译时自动生成 Mapper 接口的实现类。
 * 你可以在编译后的 target/generated-sources/annotations 目录下找到生成的实现类（这个路径可能因项目配置而异）
 */
@Mapper
public interface RequestModelMapper {
    //在 Mapper 接口中定义的 INSTANCE 字段是 MapStruct 自动生成的实现类的实例。我们可以直接使用这个实例来调用映射方法
    RequestModelMapper INSTANCE = Mappers.getMapper(RequestModelMapper.class);

    ResponseModel requestToRespsonse(RequestModel requestModel);

    /**
     * target() 必须添加，source()可以不添加，则直接使用defaultValue
     * @Mapping(target = "createTime",expression = "java(new java.util.Date())")
     * 默认表达式@Mapping#defaultExpression()是默认值和表达式的组合。仅当source属性为null时才使用它们
     *
     * @Mapping(target = "createTime" ,source = "createTime", dateFormat = "yyyy-MM-dd")
     * @param requestModel
     */
    @Mapping(source = "cName", target = "cName",defaultValue = "")
    RequestModel responseToRequest(ResponseModel requestModel);

    /**
     * 多个源对象
     * @param requestModel
     * @param responseModel
     * @return
     */
    @Mapping(target = "message",source = "responseModel.cAddress")
    ResultBean combinationConver(RequestModel requestModel, ResponseModel responseModel);

    /**
     * 使用其他的值
     * @param responseModel
     * @param message
     * @return
     */
    @Mapping(target = "message", source = "message")
    ResultBean mapTo(ResponseModel responseModel, String message);
}
